package Entity;

import java.text.NumberFormat;
import java.util.Vector;

public class Sistema implements Comparable {

    private Vector<Scommessa> partite = new Vector<Scommessa>(5);
    private Vector<Schedina> schedine = new Vector<Schedina>(4);
    private double probabilitaVittoria;
    private double puntata;
    private Vector<Double> vittorie;

    public Sistema(Vector<Scommessa> v_p, double p_puntata) throws Exception {
        setPuntata(p_puntata);
        setPartite(v_p);
        creaSchedine();
        calcolaProbabilita();
        vittorie = new Vector<Double>(5);
        calcolaVittorie();
    }

    public Scommessa getFissa() {
        return partite.get(0);
    }

    private void calcolaVittorie() {
        //0 1 2 3
        this.getVittorie().add(
                this.getSchedine().get(0).getVittoria() + this.getSchedine().get(2).getVittoria());
        //0 1 2 4
        this.getVittorie().add(
                this.getSchedine().get(0).getVittoria() + this.getSchedine().get(3).getVittoria());
        //0 1 3 4
        this.getVittorie().add(
                this.getSchedine().get(1).getVittoria() + this.getSchedine().get(2).getVittoria());
        //0 2 3 4
        this.getVittorie().add(
                this.getSchedine().get(1).getVittoria() + this.getSchedine().get(3).getVittoria());
        //0 1 2 3 4
        this.getVittorie().add(
                this.getSchedine().get(0).getVittoria() + this.getSchedine().get(1).getVittoria()
                + this.getSchedine().get(2).getVittoria() + this.getSchedine().get(3).getVittoria());

    }

    private void calcolaProbabilita() {
        probabilitaVittoria =
                partite.get(0).getProbabilita() * partite.get(1).getProbabilita() * partite.get(2).getProbabilita()
                * (1 - partite.get(3).getProbabilita()) * (1 - partite.get(4).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(3).getProbabilita() * partite.get(4).getProbabilita()
                * (1 - partite.get(1).getProbabilita()) * (1 - partite.get(2).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(1).getProbabilita() * partite.get(3).getProbabilita()
                * (1 - partite.get(2).getProbabilita()) * (1 - partite.get(4).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(2).getProbabilita() * partite.get(4).getProbabilita()
                * (1 - partite.get(1).getProbabilita()) * (1 - partite.get(3).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(1).getProbabilita() * partite.get(2).getProbabilita()
                * partite.get(3).getProbabilita()
                * (1 - partite.get(4).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(1).getProbabilita() * partite.get(2).getProbabilita()
                * partite.get(4).getProbabilita()
                * (1 - partite.get(3).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(1).getProbabilita() * partite.get(3).getProbabilita()
                * partite.get(4).getProbabilita()
                * (1 - partite.get(2).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(2).getProbabilita() * partite.get(3).getProbabilita()
                * partite.get(4).getProbabilita()
                * (1 - partite.get(1).getProbabilita());

        probabilitaVittoria +=
                partite.get(0).getProbabilita() * partite.get(1).getProbabilita() * partite.get(2).getProbabilita()
                * partite.get(3).getProbabilita() * partite.get(4).getProbabilita();
    }

    public void print() {
        System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Sistema @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
        for (Schedina s : schedine) {
            s.print();
        }
        System.out.println();

        System.out.println("Vittoria (oltre a quelle precedenti): ");
        System.out.println("Non indovinando solo : " + this.getPartite().get(4).getEvento() + " "
                + this.getPartite().get(4).getTipo() + " si vince " + NumberFormat.getInstance().format(
                (this.getVittorie().get(0) - 4) * puntata) + " €");
        System.out.println("Non indovinando solo : " + this.getPartite().get(3).getEvento() + " "
                + this.getPartite().get(3).getTipo() + " si vince " + NumberFormat.getInstance().format(
                (this.getVittorie().get(1) - 4) * puntata) + " €");
        System.out.println("Non indovinando solo : " + this.getPartite().get(2).getEvento() + " "
                + this.getPartite().get(2).getTipo() + " si vince " + NumberFormat.getInstance().format(
                (this.getVittorie().get(2) - 4) * puntata) + " €");
        System.out.println("Non indovinando solo : " + this.getPartite().get(1).getEvento() + " "
                + this.getPartite().get(1).getTipo() + " si vince " + NumberFormat.getInstance().format(
                (this.getVittorie().get(3) - 4) * puntata) + " €");
        System.out.println("Indovinandole tutte : si vince " + NumberFormat.getInstance().format(
                (this.getVittorie().get(4) - 4) * puntata) + " €\n");

        System.out.println("Con probabilità di vittoria pari a " + NumberFormat.getInstance().format(getProbabilitaVittoria() * 100) + "%");

    }

    private void creaSchedine() throws Exception {

        Scommessa uno, due, tre;
        Vector<Scommessa> v = new Vector<Scommessa>(3);

        // 1 2 3
        uno = partite.get(0);
        due = partite.get(1);
        tre = partite.get(2);
        v.add(uno);
        v.add(due);
        v.add(tre);
        schedine.add(new Schedina(v, getPuntata()));

        v = new Vector<Scommessa>(3);

        // 1 4 5
        uno = partite.get(0);
        due = partite.get(3);
        tre = partite.get(4);
        v.add(uno);
        v.add(due);
        v.add(tre);
        schedine.add(new Schedina(v, getPuntata()));

        v = new Vector<Scommessa>(3);


        // 1 2 4
        uno = partite.get(0);
        due = partite.get(1);
        tre = partite.get(3);
        v.add(uno);
        v.add(due);
        v.add(tre);
        schedine.add(new Schedina(v, getPuntata()));

        v = new Vector<Scommessa>(3);


        // 1 3 5
        uno = partite.get(0);
        due = partite.get(2);
        tre = partite.get(4);
        v.add(uno);
        v.add(due);
        v.add(tre);
        schedine.add(new Schedina(v, getPuntata()));

    }

    public void setPartite(Vector<Scommessa> partite) {
        this.partite = partite;
    }

    public Vector<Scommessa> getPartite() {
        return partite;
    }

    public void setSchedine(Vector<Schedina> schedine) {
        this.schedine = schedine;
    }

    public Vector<Schedina> getSchedine() {
        return schedine;
    }

    public void setProbabilitaVittoria(double probabilitaVittoria) {
        this.probabilitaVittoria = probabilitaVittoria;
    }

    public double getProbabilitaVittoria() {
        return probabilitaVittoria;
    }

    @Override
    public int compareTo(Object o) {
        if (((Sistema) (o)).getProbabilitaVittoria() < this.getProbabilitaVittoria()) {
            return -1;
        } else {
            if (((Sistema) (o)).getProbabilitaVittoria() == this.getProbabilitaVittoria()) {
                return 0;
            }
        }
        return 1;
    }

    public void setPuntata(double puntata) {
        this.puntata = puntata;
    }

    public double getPuntata() {
        return puntata;
    }

    public void setVittorie(Vector<Double> vittorie) {
        this.vittorie = vittorie;
    }

    public Vector<Double> getVittorie() {
        return vittorie;
    }
}
